前面幾天使用了很多的已經開發的Mesos Framework,如:Marathon、Chronos、Aurora……等等,它們的服務類型有long time service、cron job。之後有可能會根據自已的需求開發一個自訂義的Mesos Framewor,這樣也可以對Mesos Fraemwork的資源調度器和執行器有更進一些的了解。
在開發Mesos Framework時主要有Scheduler和Executor這兩個元件組合而成的,Executor不是必要的元件,以下的Demo使用Java開發只實作Scheduler的部份。
依照下面的步驟來開發自訂義的Mesos Framework:
一.建立開發環境,使用Java、Eclipse、Gradle
二.撰寫簡單的Scheduler Java Code
三.把撰寫完的程式Build成Jar檔
四.執行自訂義的Mesos Framework
五.使用Mesos WebUI檢查自訂的Framework是否有被註冊進Mesos裡
就依照上面的步驟來實作Mesos Framework
一.建立開發環境,使用Java、Eclipse、Gradle
Java、Eclipse、Gradle的安裝可以參考官方網站的文件安裝,
(1)建立source code的資料夾
# mkdir -p src/main/java
# mkdir -p src/test/java
資料夾的結構如下圖
(2)撰寫build.grale
的設定如下:
apply plugin: 'java'
apply plugin: 'eclipse'
eclipse {
jdt {
sourceCompatibility = 1.7
targetCompatibility = 1.7
}
}
repositories {
mavenCentral()
}
dependencies {
compile('org.apache.mesos:mesos:0.28.2');
}
可以按照需求更改mesos的版本或是加入新的要引入的Jar檔
(3)使用Gradle Build出,可以在Eclipse開發的環境
# gradle eclipse
(4)把開發的資料夾Import到Eclipse裡
二. 撰寫簡單的Scheduler Java Code
程式碼如下:
MyScheduler.java
package idv.jack.mesos;
import java.util.List;
import org.apache.mesos.Protos.ExecutorID;
import org.apache.mesos.Protos.FrameworkID;
import org.apache.mesos.Protos.MasterInfo;
import org.apache.mesos.Protos.Offer;
import org.apache.mesos.Protos.OfferID;
import org.apache.mesos.Protos.SlaveID;
import org.apache.mesos.Protos.TaskStatus;
import org.apache.mesos.Scheduler;
import org.apache.mesos.SchedulerDriver;
public class MyScheduler implements Scheduler{
@Override
public void registered(SchedulerDriver driver, FrameworkID frameworkId,
MasterInfo masterInfo) {
System.out.println("Scheduler id " + frameworkId.getValue());
}
@Override
public void reregistered(SchedulerDriver driver, MasterInfo masterInfo) {
System.out.println("Scheduler reregistered");
}
@Override
public void resourceOffers(SchedulerDriver driver, List<Offer> offers) {
System.out.println("received offers");
}
@Override
public void offerRescinded(SchedulerDriver driver, OfferID offerId) {
}
@Override
public void statusUpdate(SchedulerDriver driver, TaskStatus status) {
}
@Override
public void frameworkMessage(SchedulerDriver driver, ExecutorID executorId,
SlaveID slaveId, byte[] data) {
}
@Override
public void disconnected(SchedulerDriver driver) {
}
@Override
public void slaveLost(SchedulerDriver driver, SlaveID slaveId) {
}
@Override
public void executorLost(SchedulerDriver driver, ExecutorID executorId,
SlaveID slaveId, int status) {
}
@Override
public void error(SchedulerDriver driver, String message) {
}
}
這個class最重要的method是resourceOffers它主要是可以拿來接收master所發出來的資源Offer
App.java
package idv.jack.mesos;
import org.apache.mesos.MesosSchedulerDriver;
import org.apache.mesos.Protos;
public class App {
public static void main(String args[]){
Protos.FrameworkInfo.Builder frameworkInfoBuilder = Protos.FrameworkInfo.newBuilder();
frameworkInfoBuilder.setName("MY-FRAMEWORK");
frameworkInfoBuilder.setUser("");
Protos.FrameworkInfo frameworkInfo = frameworkInfoBuilder.build();
//args[0] is mesos master ip address
MesosSchedulerDriver schedulerDriver = new MesosSchedulerDriver(new MyScheduler(), frameworkInfo, args[0]);
schedulerDriver.run();
}
}
明天第30天最後一天,會繼續介紹如何build出jar檔、執行自訂義的Mesos Framework…等等的項目。